 /*******************************************************************************
  * Copyright (c) 2003, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - Initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.browser;

 import org.eclipse.swt.SWTError;
 import org.eclipse.swt.dnd.TextTransfer;
 import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.jface.action.Action;
 /**
  * Text actions (cut, copy, paste) for the Web browser.
  */
 public class TextAction extends Action {
     protected BrowserViewer browser;
     protected byte type;

     public static final byte CUT = 0;
     public static final byte COPY = 1;
     public static final byte PASTE = 2;
     
     /**
      * TextAction constructor comment.
      */
     protected TextAction(BrowserViewer browser, byte type) {
         super(type + "!"); //$NON-NLS-1$
 this.browser = browser;
         this.type = type;
     }
     
     /**
      * Copies the selected text to the clipboard. The text will be put in the
      * clipboard in plain text format.
      * <p>
      *
      * @exception SWTException <ul>
      * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
      * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
      * </ul>
      */
     public void copy() {
         Point selection = browser.combo.getSelection();
     
         int length = selection.y - selection.x;
         if (length > 0) {
             TextTransfer plainTextTransfer = TextTransfer.getInstance();
             try {
                 browser.clipboard.setContents(
                     new String [] { browser.combo.getText().substring(selection.x, selection.y) },
                     new Transfer[] { plainTextTransfer });
             } catch (SWTError error) {
                 // Copy to clipboard failed. This happens when another application
 // is accessing the clipboard while we copy. Ignore the error.
 // Fixes 1GDQAVN
 }
         }
     }
     
     /**
      * Moves the selected text to the clipboard. The text will be put in the
      * clipboard in plain text format and RTF format.
      * <p>
      *
      * @exception SWTException <ul>
      * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
      * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
      * </ul>
      */
     public void cut(){
         Point selection = browser.combo.getSelection();
     
         if (selection.y > selection.x) {
             copy();
             delete();
         }
     }
     
     /**
      * Deletes the character to the right of the caret. Delete the selected text if any.
      */
     public void delete() {
         Point selection = browser.combo.getSelection();
         String text = browser.combo.getText();
     
         if (selection.x != selection.y) {
             text = text.substring(0, selection.x) + text.substring(selection.y);
             browser.combo.setText(text);
             browser.combo.setSelection(new Point(selection.x, selection.x));
         }
     }
     
     /**
      * Replaces the selection with the clipboard text or insert the text at
      * the current caret offset if there is no selection.
      * If the widget has the SWT.SINGLE style and the clipboard text contains
      * more than one line, only the first line without line delimiters is
      * inserted in the widget.
      * <p>
      *
      * @exception SWTException <ul>
      * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
      * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
      * </ul>
      */
     public void paste() {
         TextTransfer transfer = TextTransfer.getInstance();
         Point selection = browser.combo.getSelection();
         String text = browser.combo.getText();
         
         String newText = (String ) browser.clipboard.getContents(transfer);
         if (newText != null && newText.length() > 0) {
             text = text.substring(0, selection.x) + newText + text.substring(selection.y);
             browser.combo.setText(text);
     
             // set the selection to the end of the paste
 int x = selection.x + newText.length();
             browser.combo.setSelection(new Point(x, x));
         }
     }
     
     /**
      * Implementation of method defined on <code>IAction</code>.
      */
     public void run() {
         if (browser == null || browser.combo == null)
             return;
         if (type == CUT)
             cut();
         else if (type == COPY)
             copy();
         else if (type == PASTE)
             paste();
     }
 }
